package com.wx.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.google.gson.Gson;
import com.wx.entity.SysMenu;
import com.wx.entity.SysMenuExample;
import com.wx.entity.SysRole;
import com.wx.entity.SysRoleExample;
import com.wx.entity.SysRoleMenu;
import com.wx.entity.SysRoleMenuExample;
import com.wx.entity.SysUserRoleExample;
import com.wx.service.SysMenuService;
import com.wx.service.SysRoleMenuService;
import com.wx.service.SysRoleService;
import com.wx.service.SysUserRoleService;
import com.zyht.common.AbsManageBaseController;
import com.zyht.common.bean.PropertiesUtilBean.PropertiesUtils;
import com.zyht.common.constants.RoleStatus;
import com.zyht.common.util.GsonUtil;
import com.zyht.common.util.Page;

/**
 * <b>描述：</b>	系统角色管理<br/>
 * <b>作者：</b>zrb <br/>
 * <b>修改日期：</b>2016年1月8日 - 上午11:06:04<br/>
 */
@Controller
@RequestMapping("admin/role")
public class SysRoleController extends AbsManageBaseController{

	@Resource
	private SysRoleService sysRoleService;
	
	@Resource
	private SysRoleMenuService sysRoleMenuService;

	@Resource
	private SysUserRoleService sysUserRoleService;
	
	@Resource
	private SysMenuService sysMenuService;
	
	private final String ROLE_STATUS_STOP="0";
	
	private final String ROLE_STATUS_USING="1";
	
	@RequestMapping("index")
	public String index(Integer currentPage, String roleName, Model model){
		if(null==currentPage){
			currentPage = 1;
		}
		SysRoleExample example = new SysRoleExample();
		com.wx.entity.SysRoleExample.Criteria criteria = example.createCriteria();
		criteria.andRoleStatusNotEqualTo(RoleStatus.ROLE_STATUS_NODELETE);
		if(!StringUtils.isEmpty(roleName)){
			criteria.andRoleNameLike("%"+roleName+"%");
		}
		String pSize = PropertiesUtils.getConfig("paganation_page_size");
		int pageSize = Integer.valueOf(pSize);
		PageHelper.startPage(currentPage, pageSize);
		com.github.pagehelper.Page<SysRole> pageInfo = (com.github.pagehelper.Page<SysRole>) this.sysRoleService.list(example);
		Page<SysRole> page = new Page<SysRole>((int)pageInfo.getTotal(), currentPage, pageSize);
		page.setRecordList(pageInfo);
		model.addAttribute("page", page);
		model.addAttribute("roleName", roleName);
		return "sys/role/index";
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月8日 - 下午2:40:56<br/>
	 * <b>功能说明：</b>跳转菜单修改页面<br/>
	 * @param id
	 * @param model
	 * @return
	 */
	@RequestMapping("toedit")
	public String edit(Integer id, Model model){
		if(null!=id){
			SysRole role = this.sysRoleService.findOneById(id);
			model.addAttribute("bean", role);
		}else{
			model.addAttribute("bean", new SysRole());
		}
		return "sys/role/add_update";
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月8日 - 下午3:04:36<br/>
	 * <b>功能说明：</b>跳转新增页面<br/>
	 * @param model
	 * @return
	 */
	@RequestMapping("toadd")
	public String add(Model model){
		model.addAttribute("bean", new SysRole());
		return "sys/role/add_update";
	}

	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月8日 - 下午3:09:40<br/>
	 * <b>功能说明：</b>保存菜单信息<br/>
	 * @param bean
	 * @return
	 */
	@RequestMapping("persist")
	public String saveOrUpdate(SysRole bean){
		if(null!=bean.getId()){
			this.sysRoleService.updateById(bean);
		}else{
			bean.setCreateTime(new Date());
			this.sysRoleService.addOne(bean);
		}
		return "redirect:/admin/role/msg";
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月11日 - 上午10:25:54<br/>
	 * <b>功能说明：</b>删除角色	<br/>
	 * @param id
	 * @param model
	 * @return
	 */
	@RequestMapping("del")
	public String delete(Integer id, Model model){
		if(null!=id){
			this.sysRoleService.deleteById(id);
			SysRoleMenuExample roleEx = new SysRoleMenuExample();
			roleEx.createCriteria().andRoleIdEqualTo(id);
			this.sysRoleMenuService.deleteByExample(roleEx);
			SysUserRoleExample userRoleEx = new SysUserRoleExample();
			userRoleEx.createCriteria().andRoleIdEqualTo(id);
			this.sysUserRoleService.deleteByExample(userRoleEx);
		}
		return "redirect:/admin/role/msg";
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月8日 - 下午2:57:33<br/>
	 * <b>功能说明：</b>停用菜单<br/>
	 * @param id
	 * @param response
	 */
	@RequestMapping("stopit")
	public void stopRole(Integer id, String status, HttpServletResponse response){
		if(null!=id){
			SysRole role = this.sysRoleService.findOneById(id);
			if(null!=role){
				if(status.equals(ROLE_STATUS_STOP)){
					role.setRoleStatus(ROLE_STATUS_STOP);
				}else if(status.equals(ROLE_STATUS_USING)){
					role.setRoleStatus(ROLE_STATUS_USING);
				}
				this.sysRoleService.updateById(role);
			}
		}
		JSONObject obj = new JSONObject();
		obj.put("status",200);
		writeJson(response,obj.toJSONString());
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月11日 - 下午5:32:43<br/>
	 * <b>功能说明：</b>角色权限<br/>
	 * @param rid
	 * @param model
	 * @return
	 */
	@RequestMapping("fun")
	public String functionTree(Integer rid, Model model){
		SysRoleMenuExample rmEx = new SysRoleMenuExample();
		rmEx.createCriteria().andRoleIdEqualTo(rid);
		List<SysRoleMenu> rmList = this.sysRoleMenuService.list(rmEx);
		Map<Integer, Integer> rmMap = new HashMap<Integer, Integer>();
		for(SysRoleMenu rm : rmList){
			rmMap.put(rm.getMenuId(),rm.getMenuId());
		}
		SysMenuExample example = new SysMenuExample();
		example.createCriteria().andMenuShowNotEqualTo(ROLE_STATUS_STOP);
		List<SysMenu> list = this.sysMenuService.list(example);
		for(SysMenu menu : list){
			menu.setOpen(true);
			if(rmMap.containsKey(menu.getId())){
				menu.setChecked(true);
			}
		}
		Gson gson = GsonUtil.getGsonWithAnnotation();
		String nodeList = gson.toJson(list);
		model.addAttribute("nodes", nodeList);
		model.addAttribute("roleid", rid);
		return "sys/role/function";
	}
	
	/**
	 * <b>作者:</b> zrb<br/>
	 * <b>修改时间：</b>2016年1月11日 - 下午5:29:27<br/>
	 * <b>功能说明：</b>	更新权限表<br/>
	 * @param rid
	 * @param mids
	 * @param model
	 * @return
	 */
	@RequestMapping("mfun")
	public void manageFunction(Integer rid, String mids, Model model, HttpServletResponse response){
		SysRoleMenuExample rmEx = new SysRoleMenuExample();
		rmEx.createCriteria().andRoleIdEqualTo(rid);
		List<SysRoleMenu> rmList = this.sysRoleMenuService.list(rmEx);
		List<Integer> ids = new ArrayList<>();
		for(SysRoleMenu rm : rmList){
			ids.add(rm.getId());
		}
		List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();
		String[] midArray = mids.split(",");
		for(String midstr : midArray){
			SysRoleMenu menu = new SysRoleMenu();
			menu.setRoleId(rid);
			menu.setMenuId(Integer.valueOf(midstr));
			list.add(menu);
		}
		this.sysRoleMenuService.addMore(list);
		if(ids.size()>0){
			rmEx.clear();
			rmEx.createCriteria().andRoleIdEqualTo(rid).andIdIn(ids);
			this.sysRoleMenuService.deleteByExample(rmEx);
		}
		this.writeJson(response, "{\"state\":200}");
	}
	
	@RequestMapping("msg")
	public String msg(Model model){
		model.addAttribute("redirect","admin/role/index");
		return "message";
	}
}
